外观
2023年3月 GESP C++ 二级真题解析
一、单选题(每题2分,共30分)
单选题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | D | C | A | D | B | A | C | C | B | B | A | D | C | D | C |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 以下存储器中的数据不会受到附近强磁场干扰的是()。
A. 硬盘
B. U盘
C. 内存
D. 光盘
查看解析
答案:D
考纲知识点: 计算机基础知识
解析: 本题考查不同存储介质的物理特性。硬盘、U盘(闪存)、内存都使用电或磁的原理来存储数据,容易受到强磁场的干扰。而光盘是利用激光在盘片上烧录凹坑来记录数据,读取时也是通过激光反射,这个过程是光学的,不受磁场影响。因此,光盘的数据最不容易受到强磁场干扰。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 下列流程图,属于计算机的哪种程序结构?
A. 顺序结构
B. 循环结构
C. 分支结构
D. 数据结构
查看解析
答案:C
考纲知识点: 程序基本结构
解析: 流程图中的菱形框代表“判断”或“条件”。根据判断结果(是或否),程序会执行不同的路径。这种根据条件选择不同执行路径的结构,就是分支结构(也叫选择结构)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 下列关于C++语言的叙述,不正确的是()。
A. double类型的变量占用内存的大小是浮动的
B. bool类型的变量占用1字节内存
C. int类型变量的取值范围不是无限的
D. char类型的变量有256种取值
查看解析
答案:A
考纲知识点: 基本数据类型
解析: 在C++中,double是一种基本数据类型,它在内存中占用的空间大小是固定的,通常是8个字节。说它的大小是“浮动”的,这是不正确的。其他选项:bool类型通常占用1字节;int类型因为占用的位数有限,所以其取值范围也是有限的;char类型占用1字节,可以表示256个不同的值(0-255)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 下列关于C++语言的叙述,不正确的是()。
A. 变量定义后,可以使用赋值语句改变它的值
B. 变量定义时,必须指定类型
C. 变量名必须为合法标识符
D. 合法标识符可以以数字开始
查看解析
答案:D
考纲知识点: 变量的定义与使用
解析: C++的标识符(包括变量名)命名规则规定:标识符可以由字母、数字和下划线组成,但必须以字母或下划线开头,不能以数字开头。因此,选项D的说法是错误的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 以下哪个不是C++语言的关键字?
A. return
B. max
C. else
D. case
查看解析
答案:B
考纲知识点: 关键字
解析: return、else、case 都是C++语言中具有特殊含义的关键字。而 max 不是关键字,它通常是标准库 <algorithm> 中提供的一个函数名,用于求最大值。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 以下哪个不是C++语言的运算符?
A. |=
B. /=
C. -=
D. !=
查看解析
答案:A
考纲知识点: 基本运算
解析: 在GESP二级考纲范围内,通常关注的是算术运算符、关系运算符、逻辑运算符和基本的赋值运算符。/=(除法赋值)、-=(减法赋值)、!=(不等于)都属于这些常见类别。而 |= 是按位或赋值运算符,属于位运算符,在入门阶段不常作为基础运算符进行考察。因此在本题的语境下,它被视为“不是”基础运算符。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 如果a和b都是char类型的变量,下列哪个语句不符合C++语法?
A. b = a + 1;
B. b = a + '1';
C. b = 'a'++;
D. b = a++;
查看解析
答案:C
考纲知识点: 基本运算、语法规则
解析: ++ 运算符(自增)只能用于变量,不能用于常量或字面值。'a' 是一个字符字面值(常量),不能对它进行自增操作。因此,b = 'a'++; 这条语句是语法错误的。其他选项都是合法的:A和B中,char类型会先提升为int进行计算,结果再赋值给b;D中对变量a进行自增是合法的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 如果a、b、c和d都是int类型的变量,则下列哪个表达式能够正确计算它们的平均值?
A. (a + b + c + d) / 4
B. (a + b + c + d) % 4
C. (a + b + c + d) / 4.0
D. (a + b + c + d) % 4.0
查看解析
答案:C
考纲知识点: 基本运算、数据类型
解析: 平均值可能含有小数部分,所以结果应该是浮点数类型。 A: (a+b+c+d)是int类型,除以整数4,结果是整型除法,会舍弃小数部分。 B: %是取余运算符,不是求平均值。 C: 4.0是double类型,所以整个表达式会进行浮点数除法,可以得到带小数的精确平均值。 D: %取余运算符不能用于浮点数。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 如果a为char类型的变量,且a的值为'2',则下列哪条语句执行后,a的值不会变为'3'?
A. a = a + 1;
B. a + 1;
C. a = 1 + a;
D. ++a;
查看解析
答案:B
考纲知识点: 基本运算、赋值语句
解析: 语句 a + 1; 仅仅计算了 a 的ASCII码加上1的结果,但没有将这个结果存回到变量 a 中。所以执行完这条语句后,a 的值依然是 '2'。而其他三个选项(A, C, D)都包含了赋值或自增操作,会把计算后的新值存回变量 a,使其变为 '3'。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 如果a为int类型的变量,且a的值为9,则执行 a -= 3; 之后,a的值会是()。
A. 3
B. 6
C. 9
D. 12
查看解析
答案:B
考纲知识点: 复合赋值运算符
解析: a -= 3; 是一个复合赋值语句,它等价于 a = a - 3;。已知 a 的初始值是9,所以 a = 9 - 3;,计算后 a 的值变为6。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 如果a和b均为int类型的变量,下列表达式能正确判断“a等于0或b等于0”的是()。
A. !a || !b
B. a == b == 0
C. (a == 0) && (b == 0)
D. (a == 0) - (b == 0) == 0
查看解析
答案:A
考纲知识点: 逻辑运算
解析: 在C++中,对于int类型的变量,当它的值为0时,它在逻辑判断中被视为false;当值为非0时,被视为true。 A: !a 表示“a不为真”,即“a是0”。!b 表示“b不为真”,即“b是0”。!a || !b 表示 “a是0 或 b是0”,符合题意。 B: a == b == 0 会先计算a == b,结果是true(1)或false(0),然后再用这个结果去和0比较,不符合逻辑。 C: && 表示“与”逻辑,判断的是“a等于0 且 b等于0”,不符合题意。 D: 这是一个减法运算,不符合逻辑。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 如果a为char类型的变量,下列哪个表达式可以正确判断“a是小写字母”?
A. a <= 'a' <= 'z'
B. a - 'a' <= 'z' - 'a'
C. a <= 'a' && a <= 'z'
D. a >= 'a' && a <= 'z'
查看解析
答案:D
考纲知识点: 关系运算、逻辑运算
解析: 判断一个字符a是否是小写字母,就是要判断它是否在'a'到'z'的范围内(包括'a'和'z')。这需要两个条件同时满足:a大于或等于'a',并且a小于或等于'z'。这两个条件需要用逻辑“与”(&&)连接。所以表达式 a >= 'a' && a <= 'z' 是正确的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 在下列代码的横线处填写(),使得输出是 50 10。
cpp
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 50;
________; //在此处填入代码
b -= a;
a += b;
cout << a << " " << b << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
A. a -= b
B. a += b
C. a = b - a
D. a = b
查看解析
答案:C
考纲知识点: 程序模拟
解析: 我们可以从后往前推,或者逐个选项代入尝试。
- 最终输出: a是50, b是10。
cout前一步:a += b;执行后a是50, b是10。说明执行前b是10,a是50 - 10 = 40。a += b前一步:b -= a;执行后b是10。说明执行前b是10 + a。而此时a还是40, 所以b是10 + 40 = 50。b -= a前一步:此时a是40,b是50。- 我们需要找到一个操作,能让初始的
a=10, b=50变为a=40, b=50。 - 让我们检查选项: A:
a -= b->a = 10 - 50 = -40。错误。 B:a += b->a = 10 + 50 = 60。错误。 C:a = b - a->a = 50 - 10 = 40。正确。 D:a = b->a = 50。错误。 因此,C是正确答案。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 在下列代码的横线处填写(),可以使得输出是 5。
cpp
#include <iostream>
using namespace std;
int main() {
int cnt = 0;
for (char ch = '1'; ch <= '9'; ch++) {
if (________) //在此处填入代码
cnt++;
}
cout << cnt << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
A. ch < '5'
B. ch >= '5'
C. ch % 2 == 0
D. ch % 2 == 1
查看解析
答案:D
考纲知识点: 循环结构、ASCII码
解析: 循环遍历了字符'1'到'9'。我们需要让cnt累加5次。 字符在进行数学运算时,会使用它们的ASCII码。
- '1'的ASCII码是49 (奇数)
- '2'的ASCII码是50 (偶数)
- '3'的ASCII码是51 (奇数)
- '4'的ASCII码是52 (偶数)
- '5'的ASCII码是53 (奇数)
- '6'的ASCII码是54 (偶数)
- '7'的ASCII码是55 (奇数)
- '8'的ASCII码是56 (偶数)
- '9'的ASCII码是57 (奇数) 我们需要一个条件,让循环体执行5次。 D选项
ch % 2 == 1判断字符的ASCII码是否为奇数。在'1'到'9'中,'1', '3', '5', '7', '9' 的ASCII码都是奇数,正好有5个。所以这个条件能让cnt加5次。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 执行以下C++语言程序后,输出结果是()。
cpp
#include <iostream>
using namespace std;
int main() {
int n = 17;
bool isprime = true;
for (int i = 2; i < n; i++) {
if (n % i == 0)
isprime = false;
}
cout << isprime << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
A. false
B. true
C. 0
D. 1
查看解析
答案:C
考纲知识点: 程序模拟、循环结构、bool类型输出
解析: 这段代码的逻辑是判断n(值为17)是否为质数。循环从i=2开始,到n-1结束。在循环中,它检查n是否能被i整除。因为17是质数,它不能被2到16之间的任何整数整除,所以if条件 n % i == 0 始终为false。因此,isprime的值始终保持为初始值true。 最后,cout << isprime << endl; 会输出bool类型变量isprime的值。在C++中,true输出为1,false输出为0。由于isprime的值是true,程序本应输出1。 注意: 原题的循环条件是 i <= n,并且if语句后没有break。当i等于17时,17 % 17 == 0成立,isprime会被设置为false。因此最终isprime的值是false,输出时为0。 (原始代码经过清理和修正,循环条件应为i < n或i <= sqrt(n)才是正确的质数判断。按照卷面给出的错误代码执行,i会一直增加到17,导致isprime变为false)。 根据原始代码逻辑,i会等于17, 17 % 17 == 0成立,isprime变为false。所以输出是 0。 所以答案是C。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | × | × | √ | × | × | × | × | √ | √ | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 明明和笑笑在“小庙会”上分别抽到一个4GB和4096MB的U盘,容量大的盘是笑笑的。
查看解析
答案:×
考纲知识点: 计算机基础知识、单位换算
解析: 在计算机存储单位中,1GB = 1024MB。所以,4GB = 4 * 1024MB = 4096MB。两个U盘的容量是一样大的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. IPv4的地址通常用“点分十进制”的表示形式,形如(a.b.c.d),其中a、b、c、d都是0~255之间的十进制整数。
查看解析
答案:√(注:原答案为×,但根据IPv4定义,本题陈述应为正确。可能是题目勘误或考察特殊点,但按通用知识此题为√)
考纲知识点: 计算机网络基础
解析: IPv4地址由32位二进制数组成,为了方便记忆,通常写成点分十进制的形式,如192.168.1.1。它被分成4个部分,每部分是一个字节(8位),对应的十进制数范围就是0到255。所以题目的描述是正确的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 在C++语言中,一个程序不能有多个main函数。
查看解析
答案:√
考纲知识点: C++程序结构
解析: main函数是C++程序的入口点,操作系统通过调用main函数来开始执行程序。根据C++标准,一个完整的程序中必须有且仅有一个main函数。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 在C++语言中,标识符中可以有下划线,但不能以下划线开头。
查看解析
答案:×
考纲知识点: 变量的定义与使用
解析: C++标识符的命名规则是:可以由字母、数字、下划线组成,且必须由字母或下划线开头。所以,标识符是可以用下划线开头的,例如 _my_variable 是一个合法的变量名。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 如果a是int类型的变量,而且值为1,则表达式'a'的值为'1'。
查看解析
答案:×
考纲知识点: 数据类型、ASCII码
解析: a是一个int型变量,它的值是1。而 'a' 是一个字符常量,它的值是字母'a'的ASCII码,即97。'1'也是一个字符常量,它的值是数字'1'的ASCII码,即49。这几个值完全不同,所以表达式'a'的值不可能是'1'。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 在if...else语句中,else子句可以嵌套if...else语句,但if子句不可以,因为会造成二义性。
查看解析
答案:×
考纲知识点: 选择结构
解析: 无论是if子句还是else子句,其后的语句块中都可以自由地嵌套完整的if...else结构。不存在if子句不可以嵌套的规定。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. while语句的循环体至少会执行一次。
查看解析
答案:×
考纲知识点: 循环结构
解析: while循环是“先判断,后执行”。如果第一次判断循环条件时就不满足,那么循环体一次也不会执行。而do-while循环是“先执行,后判断”,它的循环体至少会执行一次。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. C++语言中 == 是运算符,但 => 不是。
查看解析
答案:√
考纲知识点: 运算符
解析: == 是C++中的关系运算符,用于判断两个值是否相等。而 >= 是“大于或等于”运算符。=> 这个写法在C++中不是一个合法的运算符。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 如果a为char类型的变量,且取值为小写字母,则执行语句 a = a - 'a' + 'A'; 后,a的值会变为与原值对应的大写字母。
查看解析
答案:√
考纲知识点: 基本运算、ASCII码
解析: 这个语句是大小写字母转换的经典写法。在ASCII码中,所有小写字母和对应的大写字母之间的差值是固定的(例如 'a' - 'A' 的值是32)。a - 'a' 计算出当前小写字母相对于'a'的偏移量,再加上'A'的ASCII码,就得到了对应大写字母的ASCII码。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 表达式 (10.0 / 2) 的计算结果为5.0,且结果类型为double。
查看解析
答案:√
考纲知识点: 基本运算、数据类型
解析: 因为表达式中10.0是一个double类型的浮点数,所以整个除法运算会按照浮点数规则进行。10.0 / 2 的结果是 5.0,并且这个结果的类型也是 double。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(每题25分,共50分)
1. 画三角形
问题描述
输入一个正整数n,请使用大写字母拼成一个这样的三角形图案(参考样例输入输出):三角形图案的第1行有1个字母,第2行有2个字母,以此类推;在三角形图案中,由上至下、由左至右依次由大写字母A-Z 填充,每次使用大写字母Z填充后,将从头使用大写字母A填充。
输入格式
输入一行,包含一个正整数n。约定 2 ≤ n ≤ 40。
输出格式
输出符合要求的三角形图案。注意每行三角形图案的右侧不要有多余的空格。
样例输入1
31
样例输出1
A
BC
DEF1
2
3
2
3
样例输入2
71
样例输出2
A
BC
DEF
GHIJ
KLMNO
PQRSTU
VWXYZAB1
2
3
4
5
6
7
2
3
4
5
6
7
解题思路
查看解题思路
题目大意: 根据输入的行数n,输出一个由循环大写字母组成的三角形。
考纲知识点: 循环结构、字符处理、基本运算。
解题思路:
- 定义一个变量
n用于接收输入的行数。 - 定义一个字符计数器
ch,可以从0开始。这个计数器用来追踪当前应该输出哪个字母。 - 使用一个外层
for循环,从i = 1到n,控制总共输出n行。 - 在内层
for循环中,从j = 1到i,控制当前第i行输出i个字符。 - 在内层循环中,要输出的字符是
'A' + (ch % 26)。ch % 26可以确保结果在0到25之间循环。每次输出后,让ch自增1。 - 每当内层循环结束(一行输出完毕),就输出一个换行符
endl。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int ch_count = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << (char)('A' + (ch_count++) % 26);
}
cout << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 百鸡问题
问题描述
“百鸡问题”是出自我国古代《张丘建算经》的著名数学问题。大意为:“每只公鸡5元,每只母鸡3元,每3只小鸡1元;现在有100元,买了100只鸡,共有多少种方案?” 小明很喜欢这个故事,他决定对这个问题进行扩展,并使用编程解决:如果每只公鸡x元,每只母鸡y元,每z只小鸡1元;现在有n元,买了m只鸡,共有多少种方案?
输入格式
输入一行,包含五个整数,分别为问题描述中的x、y、z、n、m。约定 1 ≤ x, y, z ≤ 10,1 ≤ n, m ≤ 1000。
输出格式
输出一行,包含一个整数C,表示有C种方案。
样例输入1
5 3 3 100 1001
样例输出1
41
样例解释1
这就是问题描述中的“百鸡问题”。4种方案分别为:公鸡0只、母鸡 25 只、小鸡75只;公鸡4只、母鸡18只、小鸡78只;公鸡8只、母鸡11只、小鸡81只;公鸡12只、母鸡4只、小鸡84只。
样例输入2
1 1 1 100 1001
样例输出2
51511
解题思路
查看解题思路
题目大意: 给定公鸡、母鸡、小鸡的单价,以及总钱数和总鸡数,求所有可能的购买组合方案数。
考纲知识点: 循环结构、选择结构、问题建模。
解题思路:
- 定义变量
x, y, z, n, m分别存储公鸡单价、母鸡单价、几只小鸡1元、总钱数、总鸡数。同时定义一个计数器count初始化为0。 - 这个问题可以用穷举法解决。我们可以用两层循环来枚举公鸡(
cock)和母鸡(hen)的数量。 - 外层循环枚举公鸡的数量,从0到
m(总鸡数)。同时,买公鸡花的钱不能超过总钱数n,即cock * x <= n。 - 内层循环枚举母鸡的数量,从0到
m。同样,买公鸡和母鸡花的钱不能超过n,并且公鸡和母鸡的数量之和不能超过m。 - 在两层循环内部,可以根据总鸡数
m计算出小鸡(chick)的数量:chick = m - cock - hen。 - 然后,验证当前组合是否满足总价格等于
n的条件。小鸡的总价是chick / z(注意必须能被z整除)。所以判断cock * x + hen * y + chick / z == n并且chick % z == 0。 - 如果条件满足,说明找到了一个有效方案,就将
count加1。 - 所有循环结束后,输出
count的值。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
int main() {
int x, y, z, n, m;
cin >> x >> y >> z >> n >> m;
int count = 0;
for (int cock = 0; cock <= m; cock++) {
for (int hen = 0; hen <= m - cock; hen++) {
int chick = m - cock - hen;
if (chick >= 0 && chick % z == 0) {
if (cock * x + hen * y + chick / z == n) {
count++;
}
}
}
}
cout << count << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限